Date		:	9 septembre 1991
		Protection	:	MOT DE PASSE
		Programme	:       CONTINUM / ALPHA WAVES
		Outils		:	SOFT-ICE V2.50, MASM, LINK/TINY
		Fichier		:	FREDDY_F.COM   ( personnel )
		Temps pass�	:	1 HEURE
		Soci�t�		:	INFOGRAMMES
		Divers	        :	Compact� par un compacteur maison 
		Origine		:	INDONESIE
		Num�ro		:	140


	Ce doit �tre la quatri�me ou cinqui�me fois que je m'y remets en
	esp�rant trouver une piste. C'est le cas aujourd'hui. Les caract�res
	sont demand�s en assembleur. La touche ENTER est test�e en CS:7884.

	CS=1A8D
	CS:7884 3D1C00	CMP	AX,1C
	CS:7887 7403	JZ	788C
	CS:7889 E9E1FE	JMP	776D
	CS:788C 16	PUSH	SS
	CS:788D 8D46F6	LEA	AX,[BP-OA]
	CS:7890 50	PUSH	AX
	CS:7891 E8FAAF	CALL	288E

	Peut apr�s ce CALL on arrive � un RET o� l'on teste le contenu de AX
	avec 0004. Une bonne r�ponse y fait effectivement apparaitre la valeur
	0004 tandisqu'une mauvaise un nombre entre 0 et 3. En fait j'ai
	d�couvert plus tard que ce nombre correspondait au nombre de chiffres
	corrects. Le code en demande quatre.
	En for�ant 0004 dans AX le jeu a l'air de vouloir se d�rouler mais
	tout est m�lang� et il se plante un peu plus tard.
	Il est donc n�cessaire de trouver qui est l'auteur d'un quatre en AX
	avant le RET.
	Cel� se passe dans le CALL 288E.
	Cette routine teste les chiffres rentr�s et incr�mente DX � chaque fois
	qu'un des quatre chiffres correspond au code demand�. Puis DX est MOV�
	dans AX et l'on sort du CALL.
	Dans cette routine on trouve deux tests qui forc�s incr�mentent bien
	DX � quatre.

	Premier test dans le CALL 288E;

	CS:28CD	BBD22A	MOV	BX,2AD2
	CS:28D0 42	INC	DX	; DX est incr�ment�.
	CS:28D1 3AE1	CMP	AH,CL
	CS:28D3 750F	JNZ	28E4	; Saut � supprimer par des NOP.

	Second test dans le CALL 288E;

	CS:28FC 42	INC	DX
	CS:28FD BBD22A	MOV	BX,2AD2
	CS:2900 3AE5	CMP	AH,CH
	CS:2902 750C	JNZ	2910	; Saut � supprimer par des NOP.
	
	Evidemment cette chaine est cod�e, mais ce n'est plus un probl�me
	puisqu'il existe toujours une solution. Le principal est de trouver
	ce qu'il faut modifier, apr�s ce n'est plus qu'un choix � faire en
	fonction des allergies du programme  et/ou des moyens dont on dispose.
	Ici comme le programme est compact� par un compacteur autre que les 
	classiques LZEXE/PKLITE/EXEPACK la solution du d�tournement d'INT
	s'impose d'elle m�me. Mais j'�vite la routine r�sidente ( certain
	programme font des rejets - voir SUPER_C.DEP ) il est plus �l�gant de
	faire un programme qui appelle � son tour le programme � modifier.
	J'ai donc �crit trois petits lan�eurs ( FRANCAIS, ALLEMAND, ANGLAIS )
	puisque le programme charge au choix un de ces programmes en fonction
	de la langue choisie.
	Ci-dessous la version FRANCAISE seule est list�e;

; 	PATCH POUR LE PROGRAMME CONTINUM en FRANCAIS.
;	DETOURNEMENT DE L'INT 21 SOUS FONCTION 42.

adr_ip1		equ	28d3h	; IP du premier saut � annuler.
adr_ip2		equ	2902h	; IP du second saut.
patch		equ	9090h	; Deux NOP pour �craser les JNZ.

seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
  
		org	100h

sto		proc	far
start:		jmp	init		; r�duire la m�moire et d�placer la 
		db	90h		; pile plus pr�s.

nom_prg		db	'alpha_f.com',0,0	; 12 car max + nul
paramet		dw	0		; M�me bloc d'environnement.		
ENVIR		dw	0		; Les param�tres de la ligne de 
data_3		dw	0		; commande sont recopi�s ici puis
FCB_1		dw	0		; transmis au programme fils. ( 80h )
data_5		dw	0		
FCB_2		dw	0
data_7		dw	0
sauve_SP	dw	0
sauve_SS	dw	0
data_9		dw	0, 0
drap            equ     0

;------------------------------ PROGRAMME PERE ------------------------------

loc_1:		mov     sauve_SP,sp
		mov     sauve_SS,ss
		mov	ax,80h
		mov	ENVIR,ax	; Ligne de commande...
		mov	data_3,ds
		mov	ax,5Ch		; Premier FCB ( inutilis� )
		mov	FCB_1,ax
		mov	data_5,ds
		mov	ax,6Ch		; Second FCB ( inutilis� )
		mov	FCB_2,ax
		mov	data_7,ds
		mov	ah,35h	
		mov	al,21h
		int	21h		;  get intrpt vector al in es:bx
		mov	cs:data_9,bx
		mov	word ptr cs:data_9+2,es
		mov	ah,25h		
		mov	al,21h		
		lea	dx,cs:[int21]	; Load effective addr
		int	21h		;  set intrpt vector al to ds:dx
		lea	dx,cs:[nom_prg]	; Load effective addr
		push	ds
		pop	es
		lea	bx,cs:[paramet]	; Load effective addr
		mov	al,0
		mov	ah,4Bh		
		int	21h		; Appel du programme fils.
					; run progm @ds:dx, parm @es:bx
		mov	sp,sauve_SP	
		mov	ss,sauve_SS	
		mov	ah,25h	
		mov	al,21h	
		mov	dx,cs:data_9
		mov	ds,word ptr cs:data_9+2
		int	21h		;  set intrpt vector al to ds:dx
		mov     ah,4dh
		int     21h
		mov	ah,4Ch
		int	21h		;  terminate with al=return code
sto		endp

;---------------------------- int 21 d�tourn�e -----------------------------

int_21h_entry	proc	far
int21:		push	ax
		push    ds
		push    bp
	        push    cx
		pushf				; Push flags
		cmp     byte ptr ds:[drap],1	; Je regarde si c'est fait.
		jz      loc_2
		cmp	ah,42h			; Sous- fonction 01
		jne	loc_2			; Jump if not equal
		mov     ax,sp
		mov     bp,ds
	        mov     cx,20			; On pope 20 fois pour trouver
incr:		pop     ds			; le bon segment.
		dec     cx
		jz      s
		cmp     word ptr ds:[adr_ip1],0F75h	; Si ok on patche.
		jnz     incr				; Sinon on incr�mente.
		mov     word ptr ds:[adr_ip1],patch
		mov     word ptr ds:[adr_ip2],patch
		mov     ds,bp
                mov     byte ptr ds:[drap],1		; On y revient plus.
s:		mov     sp,ax
loc_2:		popf	
		pop     cx
	        pop     bp
		pop     ds			
		pop	ax
		jmp	dword ptr cs:data_9
int_21h_entry	endp

;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------

init:           mov ah,4ah		
		mov bx,offset fin   ; Fin du programme en BX.
		mov cl,4	    ; Divis� par 4 pour avoir des paragraphes.	
		shr bx,cl
		inc bx		    ; On en rajoute un par s�curit�.	
		int 21h		    ; Execution de la fonction 4Ah.
		mov sp,offset fin   ; on d�place la pile en "fin" car elle est
		jmp loc_1           ; plac�e en FFFE dans un programme COM.
fin_init        label near

;----------------------- PLACE RESERVEE POUR LA PILE ------------------------

; Ces donn�es ne servent qu'� r�server de la place pour la pile et seront
; d�truites lorsque cette derni�re descendra...

		db      90 dup (20h)
		db	"Bonjour FREDDY_SOFT vous salue"
		db      50 dup (20h)
		db      "Ceci est mon 140�me patche"
		db      54 dup (20h)
		db      "Demandez-moi la BIBLE du PIRATE"
		db      49 dup (20h)
		db      "On peut me joindre au 89 50 10 41"
		db      47 dup (20h)
		db      "Un de mes disciple s'y trouve...."

fin             equ this byte	    ; ici le sommet de la pile, SP

seg_a		ends
		end	start